// package语句：声明当前类所在的包
// com.itheima.constructor表示这是在构造方法演示相关的包中
package com.itheima.constructor;

// public是访问修饰符，表示这个类可以被任何地方访问
// class关键字用于定义一个类
// Test是类名，表示这是一个测试类，用于测试Student类的构造方法
public class Test {
    // main方法：Java程序的入口点
    // public static void是固定格式
    // String[] args是命令行参数数组
    public static void main(String[] args) {
        // 注释：说明这个程序的目标是认识构造器的特点和应用场景
        // 构造器的重要特点：当使用new关键字创建对象时，对象会立即自动调用相应的构造器
        
        // 使用无参数构造器创建Student对象
        // new Student()：调用Student类的无参数构造器
        // 此时会执行无参数构造器中的代码（打印"=====无参数构造器执行了======="）
        Student s1 = new Student();
        
        // 使用带String参数的构造器创建Student对象
        // new Student("西门吹雪")：调用接收一个String参数的构造器
        // 传入的参数"西门吹雪"是给构造器的n参数
        // 此时会执行该构造器中的代码（打印"=====有参数String n构造器执行了======="）
        Student s2 = new Student("西门吹雪");

        // 打印分隔线，用于区分不同的测试部分
        System.out.println("==============");

        // 使用无参数构造器创建另一个Student对象t1
        Student t1 = new Student();
        
        // 对象创建后，通过直接访问成员变量的方式赋值
        // 注意：只有当成员变量不是private修饰时才能这样直接访问
        t1.name = "石轩";  // 为t1对象的name成员变量赋值
        t1.age = 22;       // 为t1对象的age成员变量赋值
        t1.sex = '男';     // 为t1对象的sex成员变量赋值
        
        // 打印t1对象的各个成员变量的值
        System.out.println(t1.name);  // 输出：石轩
        System.out.println(t1.age);   // 输出：22
        System.out.println(t1.sex);   // 输出：男

        // 注释：说明构造器的一个常见应用场景
        // 使用带多个参数的构造器，可以在创建对象的同时立即为对象的成员变量赋值
        // 这样更简洁，不需要在创建对象后再逐个赋值
        
        // 使用带三个参数的构造器创建Student对象
        // new Student("dlei", 18, '男')：调用接收三个参数的构造器
        // 这三个参数会在构造器内部通过this关键字赋值给对象的成员变量
        Student t2 = new Student("dlei", 18, '男');
        
        // 打印t2对象的各个成员变量的值
        // 这些值已经在构造器中设置好了
        System.out.println(t2.name);  // 输出：dlei
        System.out.println(t2.age);   // 输出：18
        System.out.println(t2.sex);   // 输出：男
    }
}
